// 定义函数
function ajax( options ){
    // 在函数内部定义一个默认值对象数据
    var defaults = {
        type : "get",
        url : "",
        data : "",
        header:{
            "Content-Type" : "application/x-www-form-urlencoded"
        },
        success:function(){},
        error:function(){},
    };

    // 合并对象,  把用户传递进来的对象跟我们定义的默认值对象进行合并
    options = Object.assign(  defaults , options );


    // 1. 创建ajax对象
    var xhr = new XMLHttpRequest();
    // 2. 设置请求方式和请求地址

    // 参数字符串
    var params = "";

    // 遍历 options.data 拼接参数字符串 格式:username=李四&age=24&sex=女
    for(attr in options.data){
        params += attr+"="+options.data[attr]+"&";
    }
    
    // 去掉最后一个&符号
    params = params.substr( 0, params.length-1 ) ;

    // 根据不同的请求方式,处理传递的数据
    if( options.type == "get" ){// get请求,拼接在url地址后面
        options.url = options.url + "?" + params;
    }

    // 设置请求方式和请求地址
    xhr.open( options.type , options.url );
    
    if( options.type == "post" ){
        // 获取参数对应header值
        var contentType = options.header["Content-Type"];

        if( contentType == "application/json" ){// 传递数据是json格式
            // 在请求头中指定 Content-Type 属性的值是 application/json，告诉服务器端当前请求参数的格式是 json。
            xhr.setRequestHeader("Content-type", contentType );

            // 传递数据的时候,对象是不能直接传递,需要把JSON对象转成JSON字符串
            var jsonStr = JSON.stringify( options.data );

            // 发送json格式字符串
            xhr.send( jsonStr );
        }else if( contentType == "application/x-www-form-urlencoded" ){// 传递数据是传统表单格式 格式:username=李四&age=24&sex=女
            // post请求,设置请求头,拼接好数据,通过xhr.send(数据)
            xhr.setRequestHeader("Content-type", contentType );
            // 发送请求并携带数据
            xhr.send( params );
        }

    }else{
        // 发送请求
        xhr.send();
    }


    // 4. 响应数据的处理
    xhr.onreadystatechange = function(){
        if( xhr.readyState == 4 ){
            // 得到响应的头信息
            // console.log( xhr.getResponseHeader("Content-Type") );

            // 响应数据
            var resultData = xhr.responseText;

            // 判断响应头信息中的Content-type里面是否包含"json"字符串
            if( xhr.getResponseHeader("Content-Type").indexOf("json") != -1 ){
                // 把JSON字符串转成JSON对象
                resultData = JSON.parse( xhr.responseText );
            }
            
            if(  xhr.status == 200  ){ // 如果http状态码为200,代表ajax请求完成,没问题
                options.success( resultData );
            }else{// 如果http状态码为其他,代表ajax请求有问题,我们直接返回ajax对象即可,因为ajax有http状态码相关信息
                options.error(  xhr );
            }
        }
    }
}
